package com.onec.service.unsafe.lock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 加锁的代码：
 */
public class IncrementData {


  public static void lockAndFastIncrement(Lock lock) {

    // 抢占锁 ：必须在try 语句之外：且和try 之间不能有任何其他代码：
    // 1 在try 内： 枪锁失败 执行了finally 代码 异常
    // 2 在try 外 ： 枪锁成功 执行中间代码异常 而未释放锁

    // 3 lock 阻塞枪锁 一直阻塞
    // 4 tryLock 非阻塞枪锁没抢到锁立即返回
    lock.lock();
    try {
      // 执行临界区代码
    } catch (Exception e) {

    } finally {
      // 释放锁
      lock.unlock();
    }

    // tryLock 示例
    if (lock.tryLock()) {
      try {
        // 临界代码
      } catch (Exception e) {

      } finally {
        lock.unlock();
      }
    }
  }


  public static void testRtryLock() {
    ReentrantLock reentrantLock = new ReentrantLock();
    try {
      // 枷锁 和释放锁
      if(reentrantLock.tryLock(1, TimeUnit.SECONDS)){

      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }


}
